@爆米花
2年前 提问
1个回答

常用的端口扫描技术有哪些

房乐
2年前

常用的端口扫描技术如下:

  • TCP connect()扫描:这是最基本的TCP扫描。操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的最大优点是,不需要任何权限,系统中的任何用户都有权利使用这个调用。另一个优势就是速度。如果对每个目标端口以线性的方式,使用单独的 connect()调用,那么花费的时间就相当长。可以通过同时打开多个套接字,从而加速扫描。使用非阻塞 I/O 允许用户设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被发觉,并且被过滤掉。目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息,并且能很快地使它关闭。

  • TCP SYN扫描:这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好像准备打开一个实际的连接并等待反应一样(与TCP的3次握手建立一个 TCP 连接的过程类似)。一个 SYN|ACK 的返回信息表示端口处于侦听状态。一个 RST返回,表示端口没有处于侦听态。如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录。但这种方法的一个缺点是,必须要有root权限才能建立自己的SYN数据包。

  • TCP FIN扫描:有的时候有可能SYN扫描都不够秘密。一些防火墙和包过滤器会对一些指定的端口进行监视,有的程序能检测到这些扫描。相反,FIN数据包可能会没有任何麻烦地通过。这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系。有的系统不管端口是否打开,都回复 RST,这样,这种扫描方法就不适用了。并且这种方法在区分Unix和NT时,是十分有用的。

  • IP段扫描:这种方法不直接发送 TCP 探测数据包,是将数据包分成两个较小的 IP 段。这样就将一个 TCP头分成好几个数据包,从而过滤器就很难探测到,但必须小心,一些程序在处理这些小数据包时会有些麻烦。

  • TCP反向ident扫描:ident协议允许使用者看到通过TCP连接的计算机的用户名,即使这个连接不是由这个进程开始的。例如,连接到http端口,然后用ident来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。

  • FTP返回攻击:FTP协议的一个有趣的特点是它支持代理(Proxy)FTP连接。即入侵者可以从自己的计算机和目标主机之间建立一个FTP的连接,然后请求这个连接激活一个有效的数据传输进程来给因特网上任何地方发送文件。利用这种方法是从一个代理的FTP服务器来扫描TCP端口。这样就能在一个防火墙后面连接到一个FTP服务器,然后扫描端口。如果FTP服务器允许从一个目录读写数据的话,使用者就能发送任意的数据到发现的打开的端口。

  • UDP ICMP端口不能到达扫描:这种方法与上面几种方法的不同之处在于使用的是UDP协议。由于这个协议很简单,所以扫描变得相对比较困难。这是由于打开的端口对扫描探测并不发送一个确认,关闭的端口也并不需要发送一个错误数据包。因特网上许多主机在接收到一个未打开的UDP端口发送一个数据包时,就会返回一个ICMP_PORT_UNREACH错误。这样就能发现哪个端口是关闭的。UDP和ICMP错误都不保证能到达,因此这种扫描器必须还实现在一个包看上去是丢失的时候能重新传输。这种扫描方法是很慢的并且这种扫描方法需要具有root权限。

  • UDP recvfrom()和write()扫描:当非root用户不能直接读到端口不能到达错误时,Linux能间接地在它们到达时通知用户。例如,对一个关闭的端口的第二个write()调用将失败。在非阻塞的UDP套接字上调用recvfrom()时,如果ICMP出错还没有到达时会返回EAGAIN-重试。如果ICMP到达时,返回ECONNREFUSED-连接被拒绝。这就是用来查看端口是否打开的技术。

  • ICMP echo扫描:这并不是真正意义上的扫描。但有时通过ping,在判断在一个网络上主机是否开机时非常有用。